home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / bbs_util / bsrc_260.zip / SRC.ZIP / M7SEND.C < prev    next >
C/C++ Source or Header  |  1996-02-20  |  6KB  |  190 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*              (C) Copyright 1987-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*                  This module was written by Bob Hartman                  */
  13. /*                                                                          */
  14. /*                 BinkleyTerm Modem7 Sender State Machine                  */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*--------------------------------------------------------------------------*/
  43.  
  44. /* Include this file before any other includes or defines! */
  45.  
  46. #include "includes.h"
  47.  
  48. int MSInit (XMARGSP);
  49. int MSEnd (XMARGSP);
  50. int MSWaitNak (XMARGSP);
  51. int MSWaitChAck (XMARGSP);
  52. int MSWaitCksm (XMARGSP);
  53.  
  54. typedef struct
  55. {
  56.     char *state_name;
  57.     int (*state_func) (XMARGSP);
  58. } MSTATES, *MSTATEP;
  59.  
  60. MSTATES Modem7_Sender[] =
  61. {
  62.     {"MSInit", MSInit},
  63.     {"MSEnd", MSEnd},
  64.     {"MS0", MSWaitNak},
  65.     {"MS1", MSWaitChAck},
  66.     {"MS2", MSWaitCksm}
  67. };
  68.  
  69. int 
  70. MSInit (XMARGSP args)
  71. {
  72.     char *p;
  73.     int i;
  74.     struct FILEINFO dta;
  75.  
  76.     XON_DISABLE ();
  77.     args->tries = 0;
  78.     (void) dfind (&dta, args->filename, 0);
  79.     (void) dfind (&dta, NULL, 2);
  80.     (void) strcpy (args->m7name, "           ");
  81.     for (i = 0, p = dta.name; i < 8; p++, i++)
  82.         if ((*p != '.') && (*p != '\0'))
  83.             args->m7name[i] = (char) toupper (*p);
  84.         else
  85.             break;
  86.  
  87.     if (*p == '.')
  88.         ++p;
  89.     for (i = 8; i < 11; p++, i++)
  90.         if ((*p != '.') && (*p != '\0'))
  91.             args->m7name[i] = (char) toupper (*p);
  92.         else
  93.             break;
  94.  
  95.     /* Now do the checksum */
  96.     args->check = SUB;
  97.     for (i = 0; i < 11; i++)
  98.         args->check += (unsigned char) args->m7name[i];
  99.  
  100.     return ((int) args->control);
  101. }
  102.  
  103. int 
  104. MSEnd (XMARGSP args)
  105. {
  106.     args->result = (int) args->control;
  107.     return (args->result);
  108. }
  109.  
  110. int 
  111. MSWaitNak (XMARGSP args)
  112. {
  113.     if (args->tries >= 10)
  114.         return (FNAME_ERR);
  115.  
  116.     if (!CARRIER)
  117.         return (CARRIER_ERR);
  118.  
  119.     if (TIMED_READ (10) != NAK)
  120.     {
  121.         ++args->tries;
  122.         return (MS0);
  123.     }
  124.  
  125.     SENDBYTE (ACK);
  126.     SENDBYTE ((unsigned char) *(args->m7name));
  127.     args->fptr = args->m7name + 1;
  128.     return (MS1);
  129. }
  130.  
  131. int 
  132. MSWaitChAck (XMARGSP args)
  133. {
  134.     if (!CARRIER)
  135.         return (CARRIER_ERR);
  136.  
  137.     if (TIMED_READ (10) != ACK)
  138.     {
  139.         ++args->tries;
  140.         SENDBYTE ('u');
  141.         return (MS0);
  142.     }
  143.  
  144.     /* If filename done */
  145.     if (*(args->fptr) == '\0')
  146.     {
  147.         SENDBYTE (SUB);
  148.         return (MS2);
  149.     }
  150.     else
  151.     {
  152.         /* Send next char of name */
  153.         SENDBYTE ((unsigned char) *args->fptr++);
  154.         return (MS1);
  155.     }
  156. }
  157.  
  158. int 
  159. MSWaitCksm (XMARGSP args)
  160. {
  161.     int in_char;
  162.  
  163.     if (!CARRIER)
  164.         return (CARRIER_ERR);
  165.  
  166.     if (((in_char = TIMED_READ (10)) < 0) || ((unsigned char) in_char != args->check))
  167.     {
  168.         SENDBYTE ('u');
  169.         ++args->tries;
  170.         return (MS0);
  171.     }
  172.     else
  173.     {
  174.         SENDBYTE (ACK);
  175.         return (SUCCESS);
  176.     }
  177. }
  178.  
  179. int 
  180. Modem7_Send_File (char *filename)
  181. {
  182.     XMARGS batch;
  183.     int res;
  184.  
  185.     batch.result = 0;
  186.     batch.filename = filename;
  187.     res = state_machine ((STATEP) Modem7_Sender, &batch, 2);
  188.     return (res);
  189. }
  190.